package _4lists.src.queue;

import java.util.Objects;
import java.util.Queue;

/**
 * @className: queue2
 * @description:
 * @author: myself
 * @date: 2025/7/23 17:45
 * @version: 0.1
 * @since: JDK17
 */
/*第三种实现方法（推荐版）：
1.不需要像方法1一样预留一个位置
2.head和tail只是当一个自增的数据，不像1一样当一个指针*/
public class ArrayQueue1<E>{
    private final Object[] array ;//代表实现对列的数组
    private  int head = 0;//代表头指针，也是索引
    private  int tail = 0;//代表尾指针，也是索引
    private final int capacity;
    @SuppressWarnings("all")//可以控制不发生警告//由于这里不能正常的
    public ArrayQueue1(int capacity){
        if ((capacity & capacity - 1) != 0) {
            throw new IllegalArgumentException("capacity 必须为 2 的幂");
        }
        this.capacity = capacity;
        array = (E[])new Object[capacity];
    }

    //向队列尾部进行数据的添加
    public  boolean offer(Object value) {
        if (isFull()) {//判断是否已满
            return false;
        }
        array[tail & (capacity - 1)] = value;
        tail++;
        return true;
    }

    //查找但不移除元素
    public  Object peek() {
        if (isEmpty()) {//判断是否为空
            return null;
        }
        Object val = array[head & (capacity - 1)];
        return (E)val;
    }

    //查找并且移除元素
    public  Object poll() {
        if (isEmpty()) {//判断是否为空
            return null;
        }
        Object val = array[head & (capacity - 1)];
        head++;
        return (E)val;
    }

    //实现判断是否已满(尾指针前进一次是否等于头指针)
    public  boolean isFull() {
        return (tail-head)==array.length;//表示从头到位的元素个数是不是等于数字长度
    }

    //判断队列是否为空（当头指针等于尾指针时）
    public  boolean isEmpty() {
        return head == tail;
    }

    //进行数据的遍历
    public  void foreach() {
        if (isFull()) {
            return;
        }
        int p = head;//找一个指针指向数组，为了后续不改变head的位置
        while (p != tail) {
            System.out.println(array[p & (capacity - 1)]);
            p++;
        }
    }
}
